#!/usr/bin/ksh
##############################################################################################
# NIM mksysb backup script for AIX
# The default base backup directory is "/backups"
#
# v 1.0 - 2/18/2010 - Christopher D. DeVille
##############################################################################################

##############################################################################################
###!!!DEBUG!!! Uncomment the following line to enable debug mode !!!DEBUG!!!###
##DEBUG="yes" && set -x
##############################################################################################

##############################################################################################
###the SERVERLIST array is the list of all NIM objects that get backed up by the "-a" arg###
###the MAILLIST array is the list of Admins to mail if there is a failure###
##############################################################################################
set -A SERVERLIST server01 node02 machine03
set -A MAILLIST user1@here.com user2@here.com
MAILTMP=/tmp/nimmail.$$

##############################################################################################
###Usage function for syntax and if we run into errors###
##############################################################################################
USAGE() {
###[[ -n "$DEBUG" ]] && set -x

echo
echo "$0 [ -a ] | [ -n NIM_OBJECT_MKSYSB_NAME ] -s source_machine"  
echo
echo "    -n - if -n isn't specified then the object name will be source_machine_mksysb"
echo "    -s - will run against the single specified source_machine"
echo "    -a - will run against ALL source machines and won't work with any other options"
echo "         ALL servers as defined in ${0}: ${SERVERLIST[*]}"
echo
exit 1
}

##############################################################################################
###BACKUP function will be called individually if -s is specified###
###it will be called in a loop by BACKUPALL if -a is specified   ###
##############################################################################################
BACKUP() {
[[ -n "$DEBUG" ]] && set -x
BACKUPDIR=/backups/${SOURCE}

if [[ -z "$NAME" ]]
    then NAME=${SOURCE}_mksysb
fi

if ! lsnim -t standalone | egrep $SOURCE > /dev/null 2>&1
    then echo 
    echo "ERROR: Source machine ${SOURCE} is not a valid NIM object!" | tee -a "$MAILTMP"
    USAGE
fi 

if ! lsnim -a Cstate "$SOURCE" | egrep 'ready.for.a.NIM.operation' > /dev/null 2>&1
    then nim -F -o reset "$SOURCE" 
    sleep 5
fi

if lsnim "$NAME" > /dev/null 2>&1
    then nim -o remove "$NAME"
fi

if [[ ! -d "$BACKUPDIR" ]]
    then mkdir -p "$BACKUPDIR"
fi

nim -o define -t mksysb -a source=${SOURCE} -a server=master -a location=${BACKUPDIR}/${SOURCE}_$(date '+%m%d%Y_%H%M%S') -a mk_image=yes -a exclude_files=mksysb_exclude ${NAME}

if (( $? != 0 )) 
    then echo "NIM backup for ${SOURCE} FAILED!" | tee -a "$MAILTMP"
        else 
	echo "Removing the following old MKSYSB files:"
        find /backups -name ${SOURCE}_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9] -type f -ctime +14 -ls
        find /backups -name ${SOURCE}_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9] -type f -ctime +14 -exec rm {} \;
fi
}


##############################################################################################
###the BACKUPALL function gets called if -a is passed to the script and simply runs a loop###
##############################################################################################
BACKUPALL() {
[[ -n "$DEBUG" ]] && set -x
for x in ${SERVERLIST[*]}
    do
	SOURCE="$x"
	NAME=${SOURCE}_mksysb
        perl -e 'print "-" x 100; print "\r\n";'
	date
	echo "Backing up $x"
  	BACKUP
done
}


while getopts as:n: name
    do
        case $name in 
	    a)  aflag=1 ;;
	    s)	sflag=1
		SOURCE="$OPTARG" ;;
	    n)	nflag=1
		NAME="$OPTARG" ;;
	    *)	USAGE ;;
	esac
done


if [[ -n "$aflag" ]]
    then BACKUPALL
	elif [[ -n "$sflag" ]]
	    then BACKUP
		else USAGE
fi

if [[ -s "$MAILTMP" ]]
    then mail -s "Errors during mksysb on $(hostname)" ${MAILLIST[*]} < "$MAILTMP"
    rm "$MAILTMP"
fi

